/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import DAO.exceptions.NonexistentEntityException;
import DAO.exceptions.RollbackFailureException;
import Entidad.Cargo;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Entidad.Usuario;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.transaction.UserTransaction;

/**
 *
 * @author David
 */
public class CargoDAO implements Serializable, DAOinterface {

   public void create(Cargo cargo, EntityManager em) throws RollbackFailureException, Exception {
            Usuario usuario = cargo.getUsuario();
            if (usuario != null) {
                usuario = em.getReference(usuario.getClass(), usuario.getCorreo());
                cargo.setUsuario(usuario);
            }
            em.persist(cargo);
            if (usuario != null) {
                usuario.getCargoCollection().add(cargo);
                usuario = em.merge(usuario);
            }
    }

    public void edit(Cargo cargo, EntityManager em) throws NonexistentEntityException, RollbackFailureException, Exception {
            Cargo persistentCargo = em.find(Cargo.class, cargo.getIdCargos());
            Usuario usuarioOld = persistentCargo.getUsuario();
            Usuario usuarioNew = cargo.getUsuario();
            if (usuarioNew != null) {
                usuarioNew = em.getReference(usuarioNew.getClass(), usuarioNew.getCorreo());
                cargo.setUsuario(usuarioNew);
            }
            cargo = em.merge(cargo);
            if (usuarioOld != null && !usuarioOld.equals(usuarioNew)) {
                usuarioOld.getCargoCollection().remove(cargo);
                usuarioOld = em.merge(usuarioOld);
            }
            if (usuarioNew != null && !usuarioNew.equals(usuarioOld)) {
                usuarioNew.getCargoCollection().add(cargo);
                usuarioNew = em.merge(usuarioNew);
            }
    }

    public void destroy(Integer id, EntityManager em) throws NonexistentEntityException, RollbackFailureException, Exception {
            Cargo cargo;
            try {
                cargo = em.getReference(Cargo.class, id);
                cargo.getIdCargos();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The cargo with id " + id + " no longer exists.", enfe);
            }
            Usuario usuario = cargo.getUsuario();
            if (usuario != null) {
                usuario.getCargoCollection().remove(cargo);
                usuario = em.merge(usuario);
            }
            em.remove(cargo);
    }

    public List<Cargo> findCargoEntities(EntityManager em) {
        return findCargoEntities(true, -1, -1, em);
    }

    public List<Cargo> findCargoEntities(int maxResults, int firstResult, EntityManager em) {
        return findCargoEntities(false, maxResults, firstResult, em);
    }

    private List<Cargo> findCargoEntities(boolean all, int maxResults, int firstResult, EntityManager em) {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Cargo.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
    }

    public Cargo findCargo(Integer id, EntityManager em) {
        return em.find(Cargo.class, id);
    }

    public int getCargoCount(EntityManager em) {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Cargo> rt = cq.from(Cargo.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
    }
    
}
